package com.itheima.filter;

import com.itheima.bean.Employee;
import com.itheima.bean.User;
import com.itheima.utils.BaseContext;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    登录过滤器
        1. 定义类实现接口 Filter

        2. 在类上打注解： @WebFilter("/*")

        3. 要想让这个注解生效，必须要在启动类打上开关注解： @ServletComponentScan

        4. 在doFilter方法里面写过滤|放行的逻辑
 */
@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //0. 向下转型
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        //1. 获取当前的请求地址  http://localhost:8080/backend/index.html
        String uri = req.getRequestURI(); //  /backend/index.html
        //req.getRequestURL(); // localhost:8080/backend/index.html

        //2. 判断这个地址是否属于免登录直接放行的地址，如果是，那么就直接放行！
        if(uri.contains("login") || uri.endsWith(".js") || uri.contains("images")
            || uri.contains("plugins") || uri.contains("styles") || uri.contains(".ico")
            || uri.contains("fonts") || uri.contains("/user/code")){
            //放行！
            filterChain.doFilter(req ,resp);
            return;
        }

        //3. 如果不是，就要获取登录的凭证！【从session里面取出来员工对象】
        Employee employee = (Employee) req.getSession().getAttribute("employee");

        if(employee != null){
            //前端的也要在你这里加上保存的id值。
            //把员工的id保存到ThreadLocal里面去
            BaseContext.setCurrentId(employee.getId());

            //3.1 如果有员工对象，即表示已经登录了： 放行！
            filterChain.doFilter(req ,resp);
            return ;
        }

        //4. 判定前端用户是否已经登录了，如果登录了，就直接放行！，否则就要去登录！
        User user = (User) req.getSession().getAttribute("user");
        if(user != null){
            //添加id到TL里面去
            BaseContext.setCurrentId(user.getId());
            filterChain.doFilter(req ,resp);
            return ;
        }


        //3.2 如果没有员工对象，那么就表示没有登录：跳转到登录页面去！
        if(uri.contains("front")){
            resp.sendRedirect("/front/page/login.html");
        }else{
            resp.sendRedirect("/backend/page/login/login.html");
        }
    }
}
